"""
Program Name:Genetic Algorithm of 6V
Process:
1、生成10个神奇宝贝，每个神奇宝贝有8维度，第一个项是V数，
第二个是特征值之后6项是属性
2、10个神奇宝贝中两两繁殖，生成两个新的神奇宝贝
3、如果出现6v个体，则程序结束，打印代数，否则程序继续进行
4、如果没有出现6V个体，则选择V数最多的前十个个体来进行下一轮迭代
Model：
1、生成初始10个神奇宝贝的函数
2、繁殖函数
3、判断函数
"""
import random
import functools
rsorted=functools.partial(sorted,reverse = True)
MAX=32

def record_v(n,mnt_v):
	if n==MAX:
		return mnt_v+1
	else:
		return mnt_v

def mekepokemon(num,pkm=[]):#为初始的pokemon赋值
	mnt_v=0
	pkm.append(num)
	for i in range(0,6):
		para=random.randint(1,MAX)
		mnt_v=record_v(para,mnt_v)
		pkm.append(para)	
	pkm.insert(0,mnt_v)
	return pkm

def cheat(pkm):#检测是否出现6V
	if pkm[0]==6:
		return True
	else:
		return False

def display(pkm,len):#打印序列
	for i in range(0,len):
		print(i,pkm[i])

def follow():#决定数值跟随父亲还是母亲
	flag=random.randint(0,1)
	return flag

def breeding(pkm1,pkm2,num):
	pkm_s=[0,0,0,0,0,0,0,0]#初始化子代
	mnt_v=0

	j=random.randint(2,7)#确定突变属性
	for i in range(2,8):
		if follow()==0:#跟随父
			pkm_s[i]=pkm1[i]
		else:#跟随母
			pkm_s[i]=pkm2[i]
		if i!=j:
			mnt_v=record_v(pkm_s[i],mnt_v)#检测v数是否增加
		
	pkm_s[j]=random.randint(1,MAX)#随机一个数据随机选择
	mnt_v=record_v(pkm_s[j],mnt_v) #之前不是检测突变后是不是
	
	pkm_s[0]=mnt_v#将v数赋值第一个数
	pkm_s[1]=num
	return pkm_s

num=0
pkm=[[]for i in range(0,20)]#创立10只初始Pokemon，留下10只空位
for i in range(0,10):#为pokemon赋值
	pkm[i]=mekepokemon(num,pkm[i])
	num+=1
print(num)
flag=False
generation=1

while flag==False:
	flag=cheat(pkm[0])#判断是否需要跳出
	if flag==True:
		break

	pkm=rsorted(pkm)#对List数组内部的List，按照v数排序
	print("-------------------------------")
	print("Generation is %d" % generation)
	for i in range(0,10,2):#繁殖
		pkm[i+10]=breeding(pkm[i],pkm[i+1],num)
		num=num+1
		pkm[i+11]=breeding(pkm[i],pkm[i+1],num)
		num=num+1
	pkm=rsorted(pkm)
	display(pkm,20)

	flag=cheat(pkm[0])
	if flag==True:
		break

	generation=generation+1
















